package com.ksd.pug.service.menu;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ksd.orm.pug.mapper.NavMenuMapper;
import com.ksd.pug.commons.enums.ResultStatusEnumA;
import com.ksd.pug.commons.ex.PugBussinessException;
import com.ksd.pug.commons.utils.collection.CollectionUtils;
import com.ksd.pug.commons.utils.fn.asserts.Vsserts;
import com.ksd.pug.pojo.NavMenu;
import com.ksd.pug.vo.MenuVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author hcl
 * @date 2022/1/2 12:42
 */
@Service
@Slf4j
public class NavMenuServiceImpl extends ServiceImpl<NavMenuMapper, NavMenu> implements INavMenuService {


    @Override
    public List<NavMenu> findNavMenuTree() {
        // 1 :查询表中所有的数据
        LambdaQueryWrapper<NavMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(NavMenu::getStatus,1);
        List<NavMenu> allList = this.list(lambdaQueryWrapper); // 思考空间，为什么查询的是所有
        // 2: 找到所有的根节点 pid = 0
        List<NavMenu> rootList = allList.stream().filter(category -> category.getPid().equals(0L))
                .sorted((a, b) -> a.getSorted() - b.getSorted()).collect(Collectors.toList());
        // 3 : 查询所有的非根节点
        List<NavMenu> subList = allList.stream().filter(category -> !category.getPid().equals(0L)).collect(Collectors.toList());
        // 4 : 循环根节点去subList去找对应的子节点
        rootList.forEach(root -> buckForback(root, subList));

        return rootList;
    }


    private void buckForback(NavMenu root, List<NavMenu> subList) {
        // 通过根节点去id和子节点的pid是否相等，如果相等的话，代表是当前根的子集
        List<NavMenu> childrenList = subList.stream().filter(category -> category.getPid().equals(root.getId()))
                .sorted((a, b) -> a.getSorted() - b.getSorted())
                .collect(Collectors.toList());
        // 如果你当前没一个子集，初始化一个空数组
        if (!CollectionUtils.isEmpty(childrenList)) {
            // 查询以后放回去
            root.setChildrens(childrenList);
            // 再次递归构建即可
            childrenList.forEach(category -> buckForback(category, subList));
        } else {
            root.setChildrens(new ArrayList<>());
        }
    }

    /**
     * 查询文章列表信息并分页
     *
     * @return
     */
    @Override
    public IPage<NavMenu> findNavMenuPage(MenuVo menuVo) {
        // 1: 设置分页
        Page<NavMenu> page = new Page<>(menuVo.getPageNo(), menuVo.getPageSize());
        // 2: 设置条件
        LambdaQueryWrapper<NavMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 3：查询过滤一些字段，为啥要这样做呢？因为在开放中很多时候，我们一些表存在大字段列，而这些返回的过程非常非常查询性能。
        //lambdaQueryWrapper.select(NavMenu.class,column -> !column.getColumn().equals("description"));
        // 4: 把未删除的查询出来，那些删除的数据可以做一个回收站去回收即可
        lambdaQueryWrapper.eq(NavMenu::getIsdelete, menuVo.getIsDelete());
        // 5:根据名字进行模糊匹配
        // 多列搜索
        lambdaQueryWrapper.and(Vsserts.isNotEmpty(menuVo.getKeyword()), wrapper -> wrapper
                .like(NavMenu::getName, menuVo.getKeyword())
                .or()
                .like(NavMenu::getPath, menuVo.getKeyword())

        );
        // 条件拼接分类
        lambdaQueryWrapper.eq(Vsserts.isNotNull(menuVo.getStatus()),NavMenu::getStatus,menuVo.getStatus());

        // 6: 设置排序 根据文章排降序，代表，最新的放在最前
        lambdaQueryWrapper.orderByDesc(NavMenu::getCreateTime);
        // 7：最后返回
        return this.page(page, lambdaQueryWrapper);
    }

    /**
     * 根据文章ids删除菜单
     *
     * @param ids
     * @return
     */
    @Override
    public boolean delBatchNavMenu(String ids) {
        try {
            // 1 : 把数据分割
            String[] strings = ids.split(",");
            // 2: 组装成一个List<NavMenu>
            List<NavMenu> NavMenuList = Arrays.stream(strings).map(idstr -> {
                NavMenu navMenu = new NavMenu();
                navMenu.setId(new Long(idstr));
                navMenu.setIsdelete(1);
                return navMenu;
            }).collect(Collectors.toList());
            // 3: 批量删除
            return this.updateBatchById(NavMenuList);
        } catch (Exception ex) {
            throw new PugBussinessException(ResultStatusEnumA.IDS_ERROR_STATUS);
        }
    }



}
